package com.example.service;

import cn.hutool.core.util.ObjectUtil;
import com.example.common.enums.ApplyEnum;
import com.example.common.enums.LevelEnum;
import com.example.common.enums.ResultCodeEnum;
import com.example.common.enums.RoleEnum;
import com.example.entity.Account;
import com.example.entity.Archive;
import com.example.entity.Employee;
import com.example.exception.CustomException;
import com.example.mapper.ArchiveMapper;
import com.example.mapper.EmployeeMapper;
import com.example.utils.TokenUtils;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;

/**
 * 职位类型
 **/
@Service
public class ArchiveService {

    @Resource
    private ArchiveMapper archiveMapper;
    @Resource
    private EmployeeMapper employeeMapper;
    /**
     * 新增
     */
    public void add(Archive archive) {
        Account currentUser = TokenUtils.getCurrentUser();
        archiveMapper.insert(archive);
    }

    /**
     * 删除
     */
    public void deleteById(Integer id) {
        archiveMapper.deleteById(id);
    }

    /**
     * 批量删除
     */
    public void deleteBatch(List<Integer> ids) {
        for (Integer id : ids) {
            archiveMapper.deleteById(id);
        }
    }

    /**
     * 修改
     */
    public void updateById(Archive archive) {
        String status = archive.getStatus();
        if (ObjectUtil.isEmpty(status)){
            throw new CustomException(ResultCodeEnum.PARAM_STATUS_ERROR);
        }
        Account currentUser = TokenUtils.getCurrentUser();
        if (RoleEnum.EMPLOYEE.name().equals(currentUser.getRole())){
            Employee employee = employeeMapper.selectById(currentUser.getId());
            //又是人事经理
            if (RoleEnum.EMPLOYEE.name().equals(currentUser.getRole())){
            if (ApplyEnum.APPLY_OK.apply.equals(status)){
                //如果人事经理审核通过，将档案状态设置为人事经理审核通过，将进度设置为审核完成
                archive.setStatus(ApplyEnum.STATUS_ADMIN_APPLYINGOK.apply);
                archive.setProcess(ApplyEnum.APPLY_DONE.apply);
            }else {
                //如果人事经理审核不通过，将档案状态设置为审核不通过，并且将进度设置为审核完成
                archive.setStatus(ApplyEnum.STATUS_PersonnelManager_APPLYINGNO.apply);
                archive.setProcess(ApplyEnum.APPLY_DONE.apply);
            }
            }
        }
        if (RoleEnum.ADMIN.name().equals(currentUser.getRole())){
            //相当于管理员有权代替人事经理审核
            if (ApplyEnum.APPLY_OK.apply.equals(status)){
                //如果人事经理审核通过，将档案状态设置为人事经理审核通过，将进度设置为审核完成
                archive.setStatus(ApplyEnum.STATUS_ADMIN_APPLYINGOK.apply);
                archive.setProcess(ApplyEnum.APPLY_DONE.apply);
            }else {
                //如果人事经理审核不通过，将档案状态设置为审核不通过，并且将进度设置为审核完成
                archive.setStatus(ApplyEnum.STATUS_ADMIN_APPLYINGNO.apply);
                archive.setProcess(ApplyEnum.APPLY_DONE.apply);
            }
        }
               archiveMapper.updateById(archive);
    }

    /**
     * 根据ID查询
     */
    public Archive selectById(Integer id) {
        return archiveMapper.selectById(id);
    }
    /**
     * 查询所有
     */
    public List<Archive> selectAll(Archive archive) {
        return archiveMapper.selectAll(archive);
    }
    /*仅仅修改Process*/
    public void updateProcess(Archive archive) {
        archiveMapper.updateProcess(archive);
    }
    /**
     * 分页查询
     */
    public PageInfo<Archive> selectPage(Archive archive, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<Archive> list = archiveMapper.selectAll(archive);
        return PageInfo.of(list);
    }

   /*审批记录分页查询*/
   public PageInfo<Archive> selectPage2(Archive archive, Integer pageNum, Integer pageSize) {
       PageHelper.startPage(pageNum, pageSize);
       List<Archive> list = archiveMapper.selectAllPending(archive);
        return PageInfo.of(list);
   }
   /*待审批的记录分页查询*/
   public PageInfo<Archive> selectPage3(Archive archive, Integer pageNum, Integer pageSize) {
       String status = archive.getStatus();
       Account currentUser = TokenUtils.getCurrentUser();
       PageHelper.startPage(pageNum, pageSize); // 移动到条件判断之前，以避免不必要的分页设置

       if (RoleEnum.EMPLOYEE.name().equals(currentUser.getRole())) {
           Employee employee = employeeMapper.selectById(currentUser.getId());
           // 又是人事经理
           if (LevelEnum.PersonnelManager.equals(employee.getLevel())) {
               if (ApplyEnum.APPLY_OK.apply.equals(status) || ApplyEnum.APPLY_NO.apply.equals(status)) {
                   // 如果状态为审核通过或审核不通过，返回空的PageInfo对象
                   return PageInfo.of(Collections.emptyList());
               }
           }
       }
       if (RoleEnum.ADMIN.name().equals(currentUser.getRole())) {
           // 相当于管理员有权代替人事经理审核
           if (ApplyEnum.APPLY_OK.apply.equals(status) || ApplyEnum.APPLY_NO.apply.equals(status)) {
               // 如果状态为审核通过或审核不通过，返回空的PageInfo对象
               return PageInfo.of(Collections.emptyList());
           }
       }

       List<Archive> list = archiveMapper.selectAll(archive);
       return PageInfo.of(list);
   }

}